package tp.tecnicasdisenio.dao.impl.jdbc;

import java.sql.SQLException;
import java.util.ArrayList;

import tp.tecnicasdisenio.dao.ConsultaDaoInterface;
import tp.tecnicasdisenio.dao.DaoException;
import tp.tecnicasdisenio.model.entity.Consulta;
import tp.tecnicasdisenio.model.entity.ConsultaEstado;
import tp.tecnicasdisenio.model.entity.ConsultaTipo;

public class ConsultaDao extends DaoAbstract implements ConsultaDaoInterface{

	private String nombreTabla = "consultas", atributoId = "tema";
	
	private static ConsultaDao instancia = null;

	private ConsultaDao() {}
	
	public static ConsultaDao getInstance() {
		if (instancia == null)
			instancia = new ConsultaDao();
		return instancia;
	}
	
	@Override
	public Consulta getPorId(String id) {
		Consulta consultaDB = null;
		
		try {
			String queryString = "SELECT * FROM " + this.nombreTabla + " WHERE " + this.atributoId + "=?";

			connection = this.getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setString(1, id);
			resultSet = preparedStatement.executeQuery();
			
			if (resultSet.next()){
				consultaDB = new Consulta();
				consultaDB.setTema(resultSet.getString("tema"));
				consultaDB.setPadron(((Integer) resultSet.getInt("padron")).toString());
				consultaDB.setTipo(ConsultaTipo.values()[resultSet.getInt("tipo")]);
				consultaDB.setEstado(ConsultaEstado.values()[resultSet.getInt("estado")]);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return consultaDB;
	}

	@Override
	public ArrayList<Consulta> obtenerTodos() {
		Consulta consultaDB;
		ArrayList<Consulta> listaConsultas = new ArrayList<Consulta>();
		
		try {
			String queryString = "SELECT * FROM " + this.nombreTabla;

			connection = this.getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()){
				consultaDB = new Consulta();
				consultaDB.setTema(resultSet.getString("tema"));
				consultaDB.setPadron(((Integer) resultSet.getInt("padron")).toString());
				consultaDB.setTipo(ConsultaTipo.values()[resultSet.getInt("tipo")]);
				consultaDB.setEstado(ConsultaEstado.values()[resultSet.getInt("estado")]);

				listaConsultas.add(consultaDB);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return listaConsultas;
	}

	@Override
	public void borrar(Consulta entidad) {
		try {
			String queryString = "DELETE FROM " + this.nombreTabla + " WHERE " + this.atributoId + "=?";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setString(1, entidad.getTema());
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void actualizar(Consulta entidad) {
		try {
			String queryString = "UPDATE " + this.nombreTabla + " SET padron=?, tipo=?, estado=? WHERE " + this.atributoId + "=?";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setString(1, entidad.getPadron());
			preparedStatement.setInt(2, entidad.getTipo().ordinal());
			preparedStatement.setInt(3, entidad.getEstado().ordinal());
			preparedStatement.setString(4, entidad.getTema());
			preparedStatement.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}		
	}

	@Override
	public void insertar(Consulta entidad) {
		try {
			String queryString = "INSERT INTO " + this.nombreTabla + "(tema, padron, tipo, estado) VALUES(?,?,?,?)";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setString(1, entidad.getTema());
			preparedStatement.setString(2, entidad.getPadron());
			preparedStatement.setInt(3, entidad.getTipo().ordinal());
			preparedStatement.setInt(4, entidad.getEstado().ordinal());
			preparedStatement.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	/*
	protected ConsultaTipo int2Tipo(int tipo){
		switch (tipo){
			case 1:
				return ConsultaTipo.PRIVADA;

			case 2:
				return ConsultaTipo.PUBLICA;
			
			default:
				return ConsultaTipo.PUBLICA;
		}
	}
	
	protected int tipo2Int(ConsultaTipo tipo){
		switch (tipo){
			case PRIVADA:
				return 1;

			case PUBLICA:
				return 2;
			
			default:
				return 1;
		}
	}
	
	protected ConsultaEstado int2Estado(int estado){
		switch (estado){
			case 1:
				return ConsultaEstado.SIN_ASIGNAR;

			case 2:
				return ConsultaEstado.ASIGNADO;
				
			case 3:
				return ConsultaEstado.PENDIENTE;
				
			case 4:
				return ConsultaEstado.RESUELTO;
			
			case 5:
				return ConsultaEstado.CERRADO;
				
			default:
				return ConsultaEstado.SIN_ASIGNAR;
		}
	}
	
	protected int estado2Int(ConsultaEstado estado){
		switch (estado){
			case SIN_ASIGNAR:
				return 1;

			case ASIGNADO:
				return 2;
				
			case PENDIENTE:
				return 3;
				
			case RESUELTO:
				return 4;
			
			case CERRADO:
				return 5;
				
			default:
				return 1;
		}
	}*/
}
